in nmxact/mtech_lora/mtech_lora_sesn.go [246:303]
func (s *LoraSesn) sendFragments(b []byte) error {
segSz := s.Mtu()
crc := crc16.Crc16(b)
idx := 0
for off := 0; off < len(b); {
var seg bytes.Buffer
var blkLen int
if off == 0 {
hdr := lora.CoapLoraFragStart{
FragNum: 0,
Crc: crc,
}
blkLen = segSz - 4
if blkLen >= len(b) {
blkLen = len(b)
hdr.FragNum |= lora.COAP_LORA_LAST_FRAG
}
binary.Write(&seg, binary.LittleEndian, hdr)
seg.Write(b[0:blkLen])
} else {
hdr := lora.CoapLoraFrag{
FragNum: uint8(idx),
}
blkLen = segSz - 1
if blkLen >= len(b)-off {
blkLen = len(b) - off
hdr.FragNum |= lora.COAP_LORA_LAST_FRAG
}
binary.Write(&seg, binary.LittleEndian, hdr)
seg.Write(b[off : off+blkLen])
}
off += blkLen
idx++
seg64 := make([]byte, base64.StdEncoding.EncodedLen(len(seg.Bytes())))
base64.StdEncoding.Encode(seg64, seg.Bytes())
msg := mtechLoraTx{
Port: s.cfg.Lora.Port,
Ack: s.cfg.Lora.ConfirmedTx,
Data: string(seg64),
}
payload := []byte{}
enc := codec.NewEncoderBytes(&payload, new(codec.JsonHandle))
enc.Encode(msg)
var outData bytes.Buffer
outData.Write([]byte(fmt.Sprintf("lora/%s/down %s",
DenormalizeAddr(s.cfg.Lora.Addr), payload)))
err := s.xport.Tx(outData.Bytes())
if err != nil {
return err
}
}
return nil
}