前言
最近公司老總買了NB-IOT的模塊,老總考慮到STM32芯片的價格漲的很快,而我們的內容做的不是很復雜,再加上支持一下本地企業,QS-100模塊到價格超級實惠,決定使用QS-100模塊作為通信模塊,主要是做上位機控制設備開關的功能吧,QS-100購買鏈接如下:t淘寶購買直通車,支持一波!
1.設計方案
為實作用戶遠程控制設備開關,采用onenet云平臺作為中轉平臺,QS-100模塊作為通信和MCU,微信小程式作為上位機,實作一個簡單到NB-IOT物聯網Demo,當用戶在小程式上點擊button時,設備執行開關操作,
2. 環境準備
- VS code
- cygwim
- gcc
- Logview程式下載工具
- 串口除錯助手,如sscom、MobaXter等
3.實作程序
3.1 QS-100接入OneNet平臺
1.在onenet創建一個NB-IOT的設備,接入協議使用LWM2M協議接入,我也是第一次使用這個云平臺,所以我選擇使用舊版哈哈哈哈,方便在網上百度,
操作流程:進入NB-IOT物聯網套件->添加產品->(自己寫,網路運營可以選擇移動,作業系統選擇Linux)->添加設備,設備的IMEI、IMSI號碼均可以通過AT指令獲取,這里QS-100與OneNet云平臺的連接就是通過這兩個號碼連接的,每個設備有自己的IMEI號碼,建立連接就是依靠的這個吧(我理解的),
//獲取IMEI
AT+CGSN=1
//獲取IMSI
AT+CIMI
2.準備2.0正常版本的SDK
賣家有提供,在USERAPP目錄下,inc目錄存放.h頭檔案,src 目錄存放.c檔案,examples目錄存放廠商給的demo檔案,這里連接onenet云平臺,使用xy_cloud_demo/onenet/cis_opencu_demo.c檔案,當然也可以提前使用simpe_demo.c檔案先做一下測驗,
使用SDK進行連接,打開這個工程后在src下新建一個onenet.c檔案吧,并把cis_openmcu_demo.c檔案的內容復制放到onenet.c并把宏定義打開,再模仿一下其他點.c檔案把cis_task_init()函式放到命令列中,串口列印應該用zos_printf(),而不是xy_printf(),所以這里要在這改下,
燒錄成功后,在串口除錯助手中輸入help查看所有命令,輸入對應到命令即可,如果連接云平臺成功,onenet的云端會顯示在線,如果沒成功到話就得思考一下了,如果模塊內的imei號碼丟失,肯定是連接不上的,使用AT+CGSN=1查詢一下是否還存在,

點擊詳情,找到設備資源串列,看到屬性值這里有資料了,沒錯,這就是設備傳過來到資料,具體怎么傳過來到可以看opencpu_send_data()函式,要想發送資料給設備(下行),點擊寫即可,這里要注意屬性到型別,Colour的屬性是String型別,所以在這最好啦,

觀察onenet.c中到接收下行資料處理函式cis_demo_downstream_cb的引數可以知道,value就是從云端下發的訊息的值,

列印value、Valenlen等,因為這里的value是字符指標,也就是字符陣列的首地址,所以就這樣列印吧!
zos_printf("%s\r\n",value);
zos_printf("云平臺下發請求資料長度%d\r\n",valueLen);
出了使用onenet云端直接下發命令,也可以通過onenet提供的API介面下發命令,API介面檔案如下:
OneNetAPI,可知,需要知道這這個ID號,

不知道ID號沒有關系,可以在程式里面去看看,還是在那個函式里面,引數URI后面又賦值給了msg結構體,如下,所以這幾個引數我們可以在這獲取呀,直接zos_printf()列印就完事了,

// zos_printf("msg->objId:%d\r\n",msg->objId);
//zos_printf("msg->insId:%d\r\n",msg->insId);
//zos_printf("msg->resId:%d\r\n",msg->resId);
列印之后可以知道,分別是3311、0、0,那好,可以做個判斷,是這的時候再執行設備開關操作才好,當然這個GPIO的初始化我放到了main函式中,一定要進行初始化!否則這個燈點不亮的!zos_pin_mode(13,PIN_MODE_OUTPUT);
if(msg->objId==3311&&msg->insId==0&&msg->resId==0)
{
zos_printf("control\r\n");
char onStr[] = "0";
char offStr[] = "1";
if(strcmp(value,onStr)==0){
zos_printf("on\r\n");
zos_pin_write(13, PIN_LOW);//開
}else if(strcmp(value,offStr)==0){
zos_printf("off\r\n");
zos_pin_write(13, PIN_HIGH);//關
}else{
zos_printf("print error!\r\n");
}
}
3.2 介面測驗
可以使用Postman介面測驗工具進行測驗,下行命令發起POST請求測驗結果如下,

串口接收到資料;

請求引數和請求頭貼上去!


好啦,這就OK啦,當然也可以查看設備的資訊一類的資訊,在API檔案里面仔細閱讀即可,,發起GET請求查看設備示例如下:

3.3 微信小程式開發demo
使用微信小程式作為上位機也是比較不錯滴!只要會WEB開發就比較好上手,畢竟基于Vue.js的嘛,好,簡單到demo設計如下,先搭建出來一個框框!其實也就是對oneNet的api的運用罷了!這一點不得不說比阿里云IOT要方便不少,我還不知道阿里云IOT有沒有API這個功能介面哈!不喜勿噴,
關于小程式的賬號注冊、新建工程、界面就不再多說!
1.設定合法域名,
微信小程式的開發并不是所有的API介面都能用的,必須是https的域名才可以使用哈!
在微信小程式的后臺,開發->開發管理->開發設定中添加合法域名

如果你不想添加合法域名,只是為了測驗,也可以在除錯的時候選擇不校驗合法域名,當然這樣你發布的時候域名請求不到而已!

2.界面書寫
當然這只是一個demo,樣子寫到比較簡單,只有幾個button,
<button class="weui-btn" type="primary" bindtap="openFunction">開</button>
<button class="weui-btn" type="primary" bindtap="closeFunction">關</button>
<button class="weui-btn" type="primary" bindtap="Looksingle">查看單個設備</button>

我這里有用到了weui開發組件,如果你的界面和我的界面不一樣沒關系,請不要沮喪,在app.json中添加欄位即可,和windows并列,
"useExtendedLib": {
"weui": true
},
3.請求介面的JS寫法
代碼如下,其實就是對API介面的運用罷了,小程式的生命周期以及資料系結等等的,根據業務需求自己了解哈,
Page({
data: {
},
//打開函式
openFunction(){
console.log("開");
//全部引數
this.sendMessage("0");
},
//關閉函式
closeFunction(){
console.log("關");
this.sendMessage("1");
},
//查看單個設備處理函式
Looksingle(){
//引數
let deviceId = "754221911"
let apiKey= "xxxxxxx=";// 寫你到apiKey
let headers = {
"api-key":apiKey,
"Host":"api.heclouds.com"
}
//拼接URL地址
let GetUrl = "https://api.heclouds.com/devices/"+deviceId;
wx.request({
url: GetUrl,
method:"GET",
header:headers,
success(res){
console.log(res)
console.log("查看單個設備",res.data)
},fail(ret){
console.log(ret)
}
})
},
//發送函式
sendMessage(message){
let apiKey= "xxxxxxx=";// 寫你到apiKey
let imei = xxxxx;//寫你的imei
let obj_id =3311;
let obj_inst_id = 0;
let res_id = 0;
//發起Post請求
let header={
"api-key":apiKey,
"Host":"api.heclouds.com",
"Content-Type":"application/json",
}
//拼接URL請求地址
let postUrl = url + "?imei="+imei+"&obj_id="+obj_id+"&obj_inst_id="+obj_inst_id+"&res_id="+res_id;
wx.request({
url: postUrl,
method:"POST",
data:{
"args": message
},
header:header,
success(res){
console.log(res.data)
},fail(ret){
console.log(ret)
}
})
}
})
4 感悟與總結
onenet的API介面有點好用,只需要一些引數發起API請求即可,
5 有問題歡迎聯系交流,包畢設!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292126.html
標籤:其他
下一篇:物聯網開發總結
