跳到主要內容

ibeacon ios教學


ibeacon 是一個藍芽的發射器, ios或是android 可以透過搜尋ibeacon的訊號強度來判別手機是否進入ibeacon的範圍內,以達到

1. 手機是否進入某個範圍 (將ibeacon 放置特定區域)
2. 點名附近所有ibeacon ( 將超小型的ibeacon放置於需要點名的物品上 例如鑰匙 小孩 錢包
)

ibeacon 使用藍芽的ble技術,所以非常省電通常一顆鈕扣電池可以使用3個月不關機,如果使用大一點的電池可以撐上一兩年不需要更換電池.


一開發ibeacon之前 我們需要一台ibeacon發射器, 不花錢方案或是網路買一個

1.用iphone 或是ipad模擬
 
     例如這個
https://itunes.apple.com/us/app/beacon-simulator/id1098267039?mt=8

2.用android 模擬

例如這個
https://play.google.com/store/apps/details?id=net.alea.beaconsimulator&hl=zh_TW

3.用樹莓派模擬

     如這個網站介紹
http://cheng-min-i-taiwan.blogspot.tw/2015/03/raspberry-pi-40ibeacon.html
   指令如下
sudo hciconfig hci0 up
sudo hciconfig hci0 noscan
sudo hciconfig hci0 leadv

sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 C5 6D B5 DF FB 48 D2 B0 60 D0 F5 A7 10 96 E0 00 00 00 00 C8 00
關閉如下

sudo hciconfig hci0 down
二 ios 開發

在ios11開發 ibeacon 需要在info.plist中註冊三件事情

NSLocationAlwaysAndWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription

ios11 改變了需要註冊這三個才能開發,

CODE
using System.Diagnostics;

using CoreLocation;using Foundation;using UIKit;using UserNotifications;

namespace testBeacon{    // The UIApplicationDelegate for the application. This class is responsible for launching the    // User Interface of the application, as well as listening (and optionally responding) to application events from iOS.    [Register("AppDelegate")]    public class AppDelegate : UIApplicationDelegate    {        // class-level declarations        CLLocationManager mLocationManager;        CLBeaconRegion mRegion;        public override UIWindow Window        {            get;            set;        }
        public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)        {
            UNUserNotificationCenter.Current.RequestAuthorization(UNAuthorizationOptions.Alert, (approved, err) => {                // Handle approval            });
            UIApplication.SharedApplication.RegisterForRemoteNotifications();
            mLocationManager = new CLLocationManager();            mLocationManager.AuthorizationChanged += MLocationManager_AuthorizationChanged;            mLocationManager.RequestAlwaysAuthorization();                      mLocationManager.RegionEntered += MLocationManager_RegionEntered;            mLocationManager.RegionLeft += MLocationManager_RegionLeft;            mLocationManager.DidRangeBeacons += MLocationManager_DidRangeBeacons;
            return true;        }
        public override void OnResignActivation(UIApplication application)        {            // Invoked when the application is about to move from active to inactive state.            // This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message)             // or when the user quits the application and it begins the transition to the background state.            // Games should use this method to pause the game.        }
        public override void DidEnterBackground(UIApplication application)        {            // Use this method to release shared resources, save user data, invalidate timers and store the application state.            // If your application supports background exection this method is called instead of WillTerminate when the user quits.        }
        public override void WillEnterForeground(UIApplication application)        {            // Called as part of the transiton from background to active state.            // Here you can undo many of the changes made on entering the background.        }
        public override void OnActivated(UIApplication application)        {            // Restart any tasks that were paused (or not yet started) while the application was inactive.             // If the application was previously in the background, optionally refresh the user interface.        }
        public override void WillTerminate(UIApplication application)        {            // Called when the application is about to terminate. Save data, if needed. See also DidEnterBackground.        }



        void MLocationManager_AuthorizationChanged(object sender, CLAuthorizationChangedEventArgs e)        {            Debug.WriteLine("AuthorizationChanged" + e.Status.ToString());            if (e.Status == CLAuthorizationStatus.AuthorizedAlways || e.Status == CLAuthorizationStatus.AuthorizedWhenInUse)            {                mRegion = new CLBeaconRegion(new NSUuid("E2C56DB5-DFFB-48D2-B060-D0F5A71096E0"),"iBeacon");                //mRegion = new CLBeaconRegion(new NSUuid("1C43E644-E0EA-D00E-3193-971613064EA4"), "AkingRaspberry");                mRegion.NotifyEntryStateOnDisplay = true;                mRegion.NotifyOnExit = true;                mRegion.NotifyOnEntry = true;                mLocationManager.StartRangingBeacons(mRegion);                mLocationManager.StartMonitoring(mRegion);            }        }
        void MLocationManager_RegionEntered(object sender, CLRegionEventArgs e)        {            ShowMessage("阿鏘通知""我亂入了","跟你說我真的進來了");
        }

        private void ShowMessage(string Tilte , string SubTitle,string Body)        {            var content = new UNMutableNotificationContent();            content.Title = Tilte;            content.Subtitle = SubTitle;            content.Body = Body;            content.Badge = 1;
            var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger(5false);            var requestID = "sampleRequest";            var request = UNNotificationRequest.FromIdentifier(requestID, content, trigger);
            UNUserNotificationCenter.Current.AddNotificationRequest(request, (err) => {                if (err != null)                {                    // Do something with error...                }            });        }
        void MLocationManager_RegionLeft(object sender, CLRegionEventArgs e)        {            ShowMessage("阿鏘通知""我離開了","我真的離開了");        }
        void MLocationManager_DidRangeBeacons(object sender, CLRegionBeaconsRangedEventArgs e)        {            foreachvar b in e.Beacons)                Debug.WriteLine("Catch{0}{1}" , b.ProximityUuid.AsString() , b.Rssi);        }    }}




留言

這個網誌中的熱門文章

使用藍牙BLE 讓iphone android 連接樹莓派3 raspberry pi 3

Raspberry PI 3 終於內建藍牙與網路晶片
這個晶片有點強大,可以同時讓Wifi 與 BLE 和 SPP (RF Com) 同時繁忙通訊都沒有問題。
Raspberry PI 如果是當成藍牙Client 連結身邊的BLE裝置,例如ibeancon、智慧手環、智慧手錶,那只要使用簡單hcitool搭配hciconfig 指令就可以達到將資料要回來,在網路關鍵字一下就可以找到如何使用hcitool 連線並要得資料。
     手機要與Raspberry PI連線的方法可以透過,wifi 或是藍牙,但是操作上使用藍牙比較直覺與簡易。但是要讓手機連線Raspberry PI,Raspberry PI上就需要將藍牙裝置當成Server,這件事情就需要一些程式碼上的撰寫。
    現在的文件說到關於如何將Raspberry PI藍牙裝置當成Server的文章並不太多,開發上總感覺困難重重,我也是在這裡停滯了好多天,不斷的搜尋解決方法,因為通起來了,資料來自網路所以也回饋給網路,讓下一個使用者減少這類問題的負擔。 不過目前這個方法未來開發資源越來越齊備可能不敷使用,但至少現在是可用的備案。
    網路上搜尋之後,整體套件如下
藍牙硬體<== BlueZ <== Nodejs(Bleno) <== Node Ble <== Node Socket  <==你的程式

我們發現藍牙要動起來通常會倚賴BlueZ的套件,好在的是最新的版作業系統已經將BlueZ提升到5.23,支援BLE了。 所以安裝BlueZ套件這件事情就可以省略。
       接著安裝Node環境 ,
http://blog.itist.tw/2016/04/using-raspberry-pi-3-to-build-eddystone-beacons-with-raspbian-jessie.html
於這篇網址提到安裝Node的快速方法,如果隨著時間推移太舊或是失效,在搜尋一下如何安裝Node即可解決。
題外話:Linux上開發要有所體悟,所有的架構都是在變動的,隨著版本的變動舊的API可能就會改變或是失效,期待不變與或是統一開發方式都是不太切合實際的想法,畢竟這不是linux的核心價值也不是在這一塊領域玩樂的人的想法,但多數的答案都可以在GOOGLE一下就可以順利解決(苦笑)。

小四軸飛行器:驅動馬達

等待陀螺儀的這段時間馬達先來了,所以我們開始測試馬達驅動系統飛行器的馬達是透過Arduino發出PWM訊號,傳送給驅動器(小型為MOS FET,大型為電調)控制馬達的轉速,達到控制飛行器。為了測試我們的驅動電路,我們先寫一個簡單的PWM控制,讓PWM輸出值越來越大,到大極限的時候,又慢慢地變小,如果我們的驅動電路可以正常運作時我們應該可以聽到馬達的聲音漸漸地變大,然後漸漸地變小。
測試馬達之前我們先學習Arduino的PWM,學習的過程當中我參考了下面的網站
http://coopermaa2nd.blogspot.tw/2011/07/6-pwm.html http://coopermaa2nd.blogspot.tw/2011/07/61-pwm-modes-part1.html 感謝Cooper Maa。



一開始我們先使用一個LED正腳接再PWM Nano的D3,然後負腳接到GND,接著寫讓PWM變大變小的程式 然後又找到如下網站 葉難:Arduino練習:呼吸燈 http://yehnan.blogspot.tw/2012/02/arduino_16.html
使用網站上的程式碼,我們可以看到燈慢慢亮起來,又慢慢的暗下去, 如果看到這樣的結果代表我們的PWM範例程是可以動作。

當呼吸燈完成了,代表我們的程式碼是沒有問題的(如果有問題就是電路的問題),接下來只要把LED腳換成馬達控制腳,就可以測試我們的驅動。
查詢了一下SI2302,由下表可以知道為什麼選用這個IC ,這張表是在某個賣場抓到的 http://taiwan.tmall.com/item/20689248199.htm?

四軸飛行器:飛控板DIY

最近我有時會問自己為什麼要從Arduino 開始弄非控板,而不去買已經整體弄好的Multiwii 非控板,其實主要是自己組裝出來的樂趣,學習過程中嘗試透過各種資源與方法解決問題的能力,其實MAKER的資源很多,但怎麼應用這些資源裁示值得學習的,凌爸學習東西喜歡直接做,做的過程當中,自然就會了解WHY與HOW,這遠比看書學習的效果高上很多。

零件陸陸續續一包一包來了,發現郵費比零件貴太多~~~~@@,今天先把非控板黏在冰棒棍上,如下


正面  背面
上至下分別是 Arduino Nano,MPU6050(GY521),藍芽模組(4.0),至於固定的方式目前只是用一條雙面膠讓他們黏在上面,因為我還在考慮是否使用藍芽模組4.0還是2.1 ,2.1的好處是ARDUINO的燒錄與調適可以直接透過藍牙,如果是使用4.0就只能飛行與設定,不能燒入Arduino,但是藍牙4.0的優點是iphone 也可以控制,所以目前就先黏上藍牙4.0。

第一步 先讓Arduino 與 GY521通訊起來,這樣的開始就會特別有感覺,由於想要呈現比較高質感的電路圖,發現一套很棒的軟體 http://fritzing.org/home/ fritzing這一套電路圖軟體居然是OPEN SOURCE的,且畫出來的畫面很棒又簡單,也推薦給妳試試看,其實我蠻害怕畫電路圖的因為PROTEL太龐大了,我又不是本科系的所以電路圖對我來說太恐怖, fritzing玩起來像是玩具一樣,完全消除我心中的恐懼感。真是太感謝了,也學習到快速畫電路圖的技巧。





GY521與ARDUINO的通訊很簡單,透過I2C的連線方式即可,其實我並不太知道I2C是什麼,但是維基百科說(https://zh.wikipedia.org/zh-tw/I%C2%B2C),他是一種並聯通訊,所以我們ARDUINO上的SCL、SDA,連結到裝置的SCL、SDA之間就可以透過I2C資料傳遞。由圖可以
知道
A5 是SCL A4 是SDA
圖片網址
http://www.pighixxx.com/test/portfolio-items/nano/


連接圖如下

A5 是SCL A4 是SDA 電源 5V 與接地 然後還有一個INT 我還沒搞懂。先這樣焊接了。
這是焊接之後的樣子,果然焊接的功夫不太好。

接著燒錄軟體,燒錄軟體於下一次說明,今天先介紹硬體與機構…