作者:z494627 | 更新時間:2016-05-02 | 瀏覽量:2389
貝殼物聯上一直沒有樹莓派控制的文檔,正好用手頭的樹莓派1代做一個測試
環境:
樹莓派1代,Linux raspberrypi 3.6.11,python2.7.3
需要安裝RPi.GPIO庫
程序分析:
1.通過socket連接貝殼物聯(參照API),系統會返回:{"M":"WELCOME TO BIGIOT"}\n
2.發送checkin,設備報告上線,返回{"M":"checkinok","ID":"D+設別ID","NAME":"你的設備名稱","T":"1462165538"}\n表示你的設備已經上線
3.發送數據:我的數據接口定義了一個溫度,目前只發送一個固定的溫度,下一步DHT11接上發實際溫度
4.等待接收命令,按照命令方式觸發動作
下面是代碼:將文件保存到文件:testBigiot.py,運行時使用root登錄或者sudo python testBigiot.py(因為gpio控制需要root權限)
# -*- coding: utf-8 -*- import socket #socket通訊 import json #命令解析 import time import datetime #定時循環 import os #系統退出使用 import RPi.GPIO as GPIO #python的GPIO控制 #調用數據接口發送數據 def f_sendTemp(sock,DEVID,value): jsontemp="{\"M\":\"update\",\"ID\":\""+DEVID+"\",\"V\":{\"數據接口ID\":\"數據\"}}\n" sock.send(jsontemp) time.sleep(1) #checkin def f_checkIn(sock,DEVID,DEVPWD): jsoncheckin= "{\"M\":\"checkin\",\"ID\":\""+DEVID+"\",\"K\":\""+DEVPWD+"\"}\n" print "jsoncheckin:",jsoncheckin sock.send(jsoncheckin) data = sock.recv(1024) print 'Received', repr(data) #接收命令 def f_recv(sock,DEVID,DEVPWD): try: rcvData = sock.recv(75) #接收指令稍微長于一個命令的長度 except: return print 'Received', rcvData s=json.loads(rcvData) print 'Received', s #指令語句 if s['M'] == 'say': print 'Command', s['C'] #亮燈 if s['C'] == 'play' : GPIO.output(led_pin,GPIO.HIGH) #滅燈 if s['C']=='stop' : GPIO.output(led_pin,GPIO.LOW) #退出程序 if s['C']=='offOn' : jsonLogOut="{\"M\":\"logou\",\"ID\":"+DEVID+"\",\"NAME\":\"openwrt\",\"T\":\""+str(int(time.time()))+"\"}\n" sock.send(jsonLogOut) time.sleep(3) #退出時關閉sock sock.close() os._exit(0) #主程序 #需要替換的地方 DEVID="MyID" #貝殼物聯智能設備ID DEVPWD="My API Key" #貝殼物聯智能設備API KEY #======= led_pin=24 #LED燈連接的GPIO號 oldTime=datetime.datetime.now() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print time.strftime('%Y-%m-%d %X',time.localtime()) sock.connect(('www.eqytg.org', 8181)) Data = sock.recv(1024) print 'Received', repr(Data) time.sleep(5) f_checkIn(sock,DEVID,DEVPWD) #初始化GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(led_pin,GPIO.OUT) while 1==1: now=datetime.datetime.now() #每隔4秒發送一次溫度并且等待命令 if ((oldTime - now).seconds>4): print time.strftime('%Y-%m-%d %X',time.localtime()) f_sendTemp(sock,DEVID,DEVPWD) f_recv(sock,DEVID,DEVPWD) oldTime=now
缺陷:
1.命令發送不要太快,小于4秒發送多個命令處理會出錯.
2.長時間不發送命令會導致程序崩潰.
所以此程序只用于測試,目前還無法用于生產環境,我會持續改進.
接線圖:
點亮LED