rpi.py
4.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish
from bluetooth import *
import time
MQTT_BLOCK = False
BT_MAC_ADDRESS = '00:18:91:D8:24:39'
MED_BOTT_NO = '1'
client_socket = BluetoothSocket( RFCOMM )
client_mqtt = mqtt.Client()
# --------------------------------------------------- #
# INTERNAL FUNCTIONS
# --------------------------------------------------- #
def _send_data(msg:str):
''' Bluetooth를 통해 데이터를 송신한다
'''
client_socket.send(msg)
def _recv_data():
''' Bluetooth를 통해 데이터를 수신한다
'''
# 소켓에 2초간 받을 수 있는 시간을 준다
client_socket.settimeout(2)
# 데이터 받을 변수
data = ''
try:
timeout_start = time.time()
timeout = 2
while time.time() < timeout_start + timeout:
data += client_socket.recv(1024).decode('utf-8')
except:
print('INFO: DATA RECV TIMEOUT')
finally:
return data
def _sub_mqtt(client, userdata, flags, rc):
''' MQTT에서 subscribe한다
'''
print("Connected with result code "+str(rc))
client.subscribe(f'bottle/1/stb')
def _work_mqtt(client, userdata, msg):
''' MQTT에서 데이터를 받으면 알맞게 로직을 수행한다
'''
print('DOING SOMETHING')
global MQTT_BLOCK
MQTT_BLOCK = True
received_msg = msg.payload.decode('utf-8')
data = ''
data_list = []
# 만약 req메시지를 받았다면
if received_msg == 'req':
# 데이터가 손실되어 왔을 경우 에러 처리
if len(data_list[0]) == 0:
data_list = []
elif len(data_list[3]) == 0:
data_list = []
while len(data_list) != 4:
_send_data('REQ')
data = _recv_data()
data_list = data.split('/')
# 데이터가 손실되어 왔을 경우 에러 처리
if len(data_list[0]) == 0:
data_list = []
elif len(data_list[3]) == 0:
data_list = []
# 데이터를 Publish한다
_pub_mqtt(f'bottle/{MED_BOTT_NO}/bts', data, 'localhost')
# 만약 res메시지를 받았다면
elif received_msg.split('/')[0] == 'res':
_send_data(received_msg.split('/')[1])
data = _recv_data()
data_list = data.split('/')
# 데이터가 손실되어 왔을 경우 에러 처리
if len(data_list[0]) == 0:
data_list = []
elif len(data_list[3]) == 0:
data_list = []
while len(data_list) != 4:
_send_data('REQ')
data = _recv_data()
data_list = data.split('/')
# 데이터가 손실되어 왔을 경우 에러 처리
if len(data_list[0]) == 0:
data_list = []
elif len(data_list[3]) == 0:
data_list = []
# 데이터를 Publish한다
# _pub_mqtt(f'bottle/{MED_BOTT_NO}/bts', data, 'localhost')
print("DEBUG")
print(data)
print(data_list)
print(received_msg)
MQTT_BLOCK = False
def _pub_mqtt(topic:str, payload:str, hostname:str):
''' MQTT를 통해 데이터를 publish한다
'''
publish.single(
topic=topic,
payload=payload,
hostname=hostname)
# --------------------------------------------------- #
# MAIN
# --------------------------------------------------- #
def _run():
# CONNECT BT
client_socket.connect((BT_MAC_ADDRESS, 1))
print('bluetooth connected!')
# SUBSCRIBE MQTT
client_mqtt.on_connect = _sub_mqtt
client_mqtt.on_message = _work_mqtt
client_mqtt.connect_async("localhost")
client_mqtt.loop_start()
while True:
if MQTT_BLOCK is False:
# 항상 데이터를 받을 상태로 있는다
data = _recv_data()
# 만약 데이터가 ''가 아니면 무언가 온 것이므로 처리한다
if data != '':
print('DATA IN')
data_list = data.split('/')
# 데이터가 손실되어 왔을 경우 에러 처리
if len(data_list[0]) == 0:
data_list = []
elif len(data_list[3]) == 0:
data_list = []
# 만약 데이터가 불량하게 왔을 경우, 제대로 올때까지 반복시도한다
while len(data_list) != 4:
data = _recv_data()
data_list = data.split('/')
# 데이터가 손실되어 왔을 경우 에러 처리
if len(data_list[0]) == 0:
data_list = []
elif len(data_list[3]) == 0:
data_list = []
# 데이터를 Publish한다
_pub_mqtt(f'bottle/{MED_BOTT_NO}/bts', data, 'localhost')
client_socket.close()
if __name__ == '__main__':
_run()