# Wireless Lab 2
###### tags: `Wireless`
## :star: 實驗結果
1. 跑完OTAA傳輸模式的流程,分別截圖`join_ttn.py`,`send_ttn.py`的結果
2. 將send_ttn.py的message改成:Wireless Lab2
3. 傳輸資料後用MQTT查看,並用base64解密截圖。
4. **以組為單位(一個人上傳即可)**,將這些截圖結果貼成一個word檔案,命名為`wireless-lab2-groupxx.docx`,並上傳到LMS作業區。
## What is OTAA?

## OTAA模式送出 (join_ttn.py)
這份程式主要修改來自 [jeroennijhof](https://github.com/jeroennijhof/LoRaWAN) 的程式碼
1. 將[實驗程式碼](https://github.com/Ox7FFFFFFF/Wireless-Lab2)載下來
```shell
$ git clone https://github.com/Ox7FFFFFFF/Wireless-Lab2
```
* 程式資料夾
<i class="fa fa-folder-open"></i> LoRaWAN - 與LoRaWAN相關的程式
<i class="fa fa-folder-open"></i> SX127x - 控制晶片的SPI程式
<i class="fa fa-file-text"></i> send_ttn.py - 資料送出
<i class="fa fa-file-text"></i> join_ttn.py - 送出Join封包
<i class="fa fa-file-text"></i> config.json - Activated [DevAddr, NwkSKey, AppSKey]配置
2. 在`join_ttn.py`填入deveui,appeui,appkey
* DEV_EUI : 000000000000001x (x=組別)
```python=81
# Init
deveui = list(bytearray.fromhex('DEV_EUI')) #輸入你組別裝置EUI
appeui = list(bytearray.fromhex('1234efc7104f1230')) #勿動
appkey = list(bytearray.fromhex('a346b6faef2bd33c16fe9b1d8d47a11d')) #勿動
devnonce = [randrange(256), randrange(256)]
```
3. 發送Join Request,裡面會帶入deveui,appeui,devnonce
```python=66
def join(self):
lorawan = LoRaWAN.new(appkey)
lorawan.create(MHDR.JOIN_REQUEST, {'deveui': deveui,
'appeui': appeui, 'devnonce': devnonce})
self.write_payload(lorawan.to_raw())
self.set_mode(MODE.TX)
```
4. 送出uplink後,會跳到`on_tx_done`
```python=55
def on_tx_done(self):
self.clear_irq_flags(TxDone=1)
print("TxDone")
# 切換到rx
self.set_mode(MODE.STDBY)
self.set_dio_mapping([0,0,0,0,0,0])
self.set_invert_iq(1)
self.reset_ptr_rx()
sleep(4)
self.set_mode(MODE.RXCONT)
```
5. 當收到downlink時,會跳到`on_rx_done`
<font size=2>
```python=18
def on_rx_done(self):
print("RxDone")
self.clear_irq_flags(RxDone=1)
payload = self.read_payload(nocheck=True)
lorawan = LoRaWAN.new([], appkey)
lorawan.read(payload)
lorawan.get_payload()
# 判斷格式是否為JOIN_ACCEPT
if lorawan.get_mhdr().get_mtype() == MHDR.JOIN_ACCEPT:
print("get mic: ",lorawan.get_mic())
print("compute mic: ",lorawan.compute_mic())
print("valid mic: ",lorawan.valid_mic())
# 判斷downlink是不是自己的
if lorawan.valid_mic():
devaddr = binary_array_to_hex(lorawan.get_devaddr())
nwskey = binary_array_to_hex(lorawan.derive_nwskey(devnonce))
appskey = binary_array_to_hex(lorawan.derive_appskey(devnonce))
print("devaddr:",devaddr)
print("nwskey :",nwskey)
print("appskey:",appskey)
# 將收到的devaddr,nwskey,appskey寫到檔案中
config = {'devaddr':devaddr,'nwskey':nwskey,'appskey':appskey,'fCnt':0}
data = json.dumps(config, sort_keys = True, indent = 4, separators=(',', ': '))
fp = open("config.json","w")
fp.write(data)
fp.close()
print("Join Accept")
sys.exit(0)
else:
print("Fail to join!")
sys.exit(0)
```
</font>
6. 執行`join_ttn.py`
```shell
$ python3 join_ttn.py
```

7. Join成功會取得devaddr,nwkskey,appskey,並寫到`config.json`中

8. 使用上次的`send_ttn.py`傳輸資料,並使用MQTT查看傳輸的資料


