##わからないこと
次のサイトに掲載されているソースコードを使おうとしていますが,
https://github.com/AmbientDataInc/LoRa-rssi-measure/blob/master/RPi3/main.py
あらかじめソースコードの意味を理解しようとしています.
どうしても分からない部分があり,教えていただけると助かります.
86行目,126行目
sys.stdout.flush()
とありますが,
その前に,
出力先の設定sys.stdout=xxxが定義されていませんし,
出力sys.stdout.writeの記述もありません.
なぜ,ここでflush()がされているのかが分からず困っています.
(ちなみにソースコードの作者にも質問してみましたが,質問を受け付けてもらえませんでした.)
##ソースコード
python
1# sf, bwを変えながら移動端末から受信する 2# 3# LoRaモジュールから1行読み、rssi、panid、srcid、msgに分解 4# さらにmsgが'latlng=(lat,lng)'という形式なので、'(lat,lng)'部分をTupleに変換 5# rssiを保存し、Ambientに送信 6# 7# 8 9import lora 10import ast 11import time 12import struct 13import sys 14import ambient 15 16# (bw, sf, timeout) 17mode = [ 18 (3, 12, 5), (3, 11, 5), (3, 10, 4), (3, 9, 3), (3, 8, 2), (3, 7, 2), 19 (4, 12, 5), (4, 11, 4), (4, 10, 3), (4, 9, 3), (4, 8, 2), (4, 7, 2), 20 (5, 12, 4), (5, 11, 3), (5, 10, 2), (5, 9, 2), (5, 8, 2), (5, 7, 2), 21 (6, 12, 3), (6, 11, 3), (6, 10, 2), (6, 9, 2), (6, 8, 2), (6, 7, 2) 22] 23 24channelId1 = チャネルID1 25writeKey1 = 'ライトキー1' 26channelId2 = チャネルID2 27writeKey2 = 'ライトキー2' 28channelId3 = チャネルID3 29writeKey3 = 'ライトキー3' 30channelId4 = チャネルID4 31writeKey4 = 'ライトキー4' 32 33am1 = ambient.Ambient(channelId1, writeKey1) 34am2 = ambient.Ambient(channelId2, writeKey2) 35am3 = ambient.Ambient(channelId3, writeKey3) 36am4 = ambient.Ambient(channelId4, writeKey4) 37 38lr = lora.LoRa() 39 40def printable(l): 41 x = struct.unpack(str(len(l)) + 'b', l) 42 y = '' 43 for i in range(len(x)): 44 if x[i] >= 0: 45 y = y + chr(x[i]) 46 return y 47 48def sendcmd(cmd): 49 # print(cmd) 50 lr.write(cmd) 51 t = time.time() 52 while (True): 53 if (time.time() - t) > 5: 54 print('panic: %s' % cmd) 55 exit() 56 line = lr.readline() 57 if 'OK' in printable(line): 58 # print(line) 59 return True 60 elif 'NG' in printable(line): 61 # print(line) 62 return False 63 64def setMode(bw, sf): 65 lr.write('config\r\n') 66 lr.s.flush() 67 time.sleep(0.2) 68 lr.reset() 69 time.sleep(1.5) 70 71 line = lr.readline() 72 while not ('Mode' in printable(line)): 73 line = lr.readline() 74 if len(line) > 0: 75 print(line) 76 77 sendcmd('2\r\n') 78 sendcmd('bw %d\r\n' % bw) 79 sendcmd('sf %d\r\n' % sf) 80 sendcmd('q 2\r\n') 81 sendcmd('w\r\n') 82 83 lr.reset() 84 print('LoRa module set to new mode') 85 time.sleep(1) 86 sys.stdout.flush() 87 88while (True): 89 rssi = [None] * len(mode) 90 latlng = () 91 for i in range(len(mode)): 92 print('setMode(bw: %d, sf: %d)' % (mode[i][0], mode[i][1])) 93 setMode(mode[i][0], mode[i][1]) 94 95 t = None if i == 0 else mode[i][2] 96 timeout = False 97 start = time.time() 98 while (True): 99 while (True): 100 line = lr.readline(t) 101 # print(line) 102 # sys.stdout.flush() 103 if len(line) == 0: # TIMEOUT 104 timeout = True 105 break 106 if len(line) >= 14: # 'rssi(4bytes),pan id(4bytes),src id(4bytes),\r\n'で14バイト 107 break 108 if timeout == True: 109 rssi[i] = None 110 print('TIMEOUT') 111 break; 112 data = lr.parse(line) # 'rssi(4bytes),pan id(4bytes),src id(4bytes),laglng=(12バイト,12バイト)\r\n', ペイロード34バイト 113 print(data) 114 if 'loc=' in data[3]: 115 loc = ast.literal_eval(data[3].split('=')[1]) 116 rssi[i] = data[0] 117 latlng = loc 118 s = mode[i][2] - (time.time() - start) 119 # print('sleep: ' + str(s)) 120 if i != 0 and s > 0: 121 time.sleep(s) 122 break 123 124 print(rssi) 125 print(latlng) 126 sys.stdout.flush() 127 128 am1.send({'d1': rssi[5], 'd2': rssi[4], 'd3': rssi[3], 'd4': rssi[2], 'd5': rssi[1], 'd6': rssi[0], 'lat': latlng[0], 'lng': latlng[1]}) 129 am2.send({'d1': rssi[11], 'd2': rssi[10], 'd3': rssi[9], 'd4': rssi[8], 'd5': rssi[7], 'd6': rssi[6], 'lat': latlng[0], 'lng': latlng[1]}) 130 am3.send({'d1': rssi[17], 'd2': rssi[16], 'd3': rssi[15], 'd4': rssi[14], 'd5': rssi[13], 'd6': rssi[12], 'lat': latlng[0], 'lng': latlng[1]}) 131 am4.send({'d1': rssi[23], 'd2': rssi[22], 'd3': rssi[21], 'd4': rssi[20], 'd5': rssi[19], 'd6': rssi[18], 'lat': latlng[0], 'lng': latlng[1]})
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。