# S3_CAP, a modular framework for slotted transmission This tutorial shows how to use the [S3_CAP framework](https://github.com/AmauryPARIS/gr-ephyl) inside the FIT/CorteXlab testbed and implement a access policy. The framework allows you to change the used PHY layer, as described [here](https://github.com/AmauryPARIS/gr-ephyl#phy-layer), but the tutorial will only show you how to implement the access policy. First you need to retrieve this [docker image](https://hub.docker.com/repository/docker/amauryparis/s3cap): you@yourpc:~$ docker pull amauryparis/s3cap:latest you@yourpc:~$ docker run -dti --net=host --expose 2222 --privileged amauryparis/s3cap:latest Access the docker container using ssh : you@yourpc:~$ ssh -Xp 2222 root@localhost In this environment, you have access to the S3CAP project with a LoRa PHY layer. By default, a dummy and random access policy is implemented in files `upper/sn_upper.py` and `upper/bs_upper.py`. You can change the two files as follow, to update the access policies of our system and make every node transmitting on a predefined slot. We will also update the content of control messages. New `upper/sn_upper.py` : while True: feedback_pmt = up.recv() feedback = up.extract(feedback_pmt) up.log(feedback["NODE"], "SN - Feedback received - source sensor : %s | frame : %s | dlcch : %s" % (feedback["NODE"], feedback["FRAME"], feedback["DLCCH"])) print("SN - Feedback received - source sensor : %s | frame : %s | dlcch : %s" % (feedback["NODE"], feedback["FRAME"], feedback["DLCCH"])) action = "True" frame = feedback["FRAME"] + 1 if feedback["NODE"] == "A": sequence = [[0, "Y"], [1, False], [1, False], [1, False]] ulcch = str("poulet_basquaise") else: sequence = [[0, False], [1, "X"], [1, False], [1, False]] ulcch = str("boeuf_bourguignon") inst = up.create_SN_inst(feedback["NODE"], frame, action, sequence, ulcch) up.send(inst) up.log(frame, "Instruction send - %s" % (inst)) print("SN - Instruction send - %s" % (inst)) New `upper/bs_upper.py`: while True: feedback_pmt = up.recv() feedback = up.extract(feedback_pmt) up.log(feedback["FRAME"], "Feedback received - frame : %s | ulcch : %s | rx : %s" % (feedback["FRAME"], feedback["ULCCH"], feedback["RX"])) print("Feedback received - frame : %s | ulcch : %s | rx : %s" % (feedback["FRAME"], feedback["ULCCH"], feedback["RX"])) list_dlcch = [] frame = feedback["FRAME"] + 1 for sensor in up.list_sensors: dlcch = str("tarte_aux_pommes") list_dlcch.append([sensor, dlcch]) inst = up.create_BS_inst(list_dlcch, frame) up.send(inst) up.log(frame, "Instruction send - %s" % (inst)) print("Instruction send - %s" % (inst)) You can also set the number of slot on the uplink channel, with the `slot_count` parameter in the sensor and base station upper files, and with the `--S` option inside the GNU Radio flowgraph. You can now exit the docker container, to commit and push the updated version on your account. you@yourpc:~$ docker ps -a you@yourpc:~$ docker commit [CONTAINER ID] [NEW IMAGE NAME] you@yourpc:~$ docker tag [NEW IMAGE NAME] [DOCKER USERNAME]/[NEW IMAGE NAME] you@yourpc:~$ docker login you@yourpc:~$ docker push [DOCKER USERNAME]/[NEW IMAGE NAME] After booking the testbed with OAR, you can upload the image on three nodes of your choice with an SSH access, as follow : nodeX: container: - image: [DOCKER USERNAME]/[NEW IMAGE NAME]:latest command: /usr/sbin/sshd -p 2222 -D Once connected to each of the three nodes, you can run the following commands. It will start the access policy and then the PHY layer of each node. On `NODE_X` - the first sensor python2 /root/cxlb_toolchain_build/gr-ephyl/upper/sn_upper.py --slot_count=4 & python2 /root/cxlb_toolchain_build/gr-ephyl/examples/LoRa/sn_multislot_dyn_ephyl_lora.py --sn-id=A --ip-bs-addr=NODE_Z --S=4 On `NODE_Y` - the second sensor python2 /root/cxlb_toolchain_build/gr-ephyl/upper/sn_upper.py --slot_count=4 & python2 /root/cxlb_toolchain_build/gr-ephyl/examples/LoRa/sn_multislot_dyn_ephyl_lora.py --sn-id=B --ip-bs-addr=NODE_Z --S=4 On `NODE_Z` - the base station python2 /root/cxlb_toolchain_build/gr-ephyl/upper/bs_upper.py --slot_count=4 & python2 /root/cxlb_toolchain_build/gr-ephyl/examples/LoRa/bs_multisn_multislot_dyn_ephyl_lora.py --sn-1-ip-addr=NODE_X --sn-2-ip-addr=NODE_Y --S=4 You will then observe the newly updated access policy.