2010-11-17 09:21:48 +00:00
|
|
|
Object subclass: GSM0808IE [
|
2010-11-19 08:02:26 +00:00
|
|
|
<category: 'osmo-message'>
|
2010-11-17 09:21:48 +00:00
|
|
|
<comment: 'Base class of IEs for GSM0808'>
|
|
|
|
]
|
|
|
|
|
|
|
|
Object subclass: GSM0808Helper [
|
2010-11-19 08:02:26 +00:00
|
|
|
GSM0808Helper class >> msgComplL3 [ <category: 'spec'> ^ 16r57 ]
|
|
|
|
GSM0808Helper class >> msgReset [ <category: 'spec'> ^ 16r30 ]
|
|
|
|
GSM0808Helper class >> msgResetAck [ <category: 'spec'> ^ 16r31 ]
|
|
|
|
GSM0808Helper class >> msgClear [ <category: 'spec'> ^ 16r20 ]
|
|
|
|
GSM0808Helper class >> msgClearComp [ <category: 'spec'> ^ 16r21 ]
|
2010-11-17 09:21:48 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
Object subclass: LAI [
|
2010-11-23 17:47:39 +00:00
|
|
|
| mcc mnc |
|
2010-11-19 08:02:26 +00:00
|
|
|
<category: 'osmo-message'>
|
|
|
|
<comment: 'Generate a Location Area Identifier'>
|
|
|
|
|
2010-11-23 17:47:39 +00:00
|
|
|
LAI class >> initWith: mcc mnc: mnc [
|
|
|
|
^ self new
|
|
|
|
mcc: mcc;
|
|
|
|
mnc: mnc;
|
|
|
|
yourself
|
|
|
|
]
|
|
|
|
|
2010-11-23 19:08:49 +00:00
|
|
|
LAI class >> parseFrom: aByteArray [
|
|
|
|
| mcc mnc |
|
|
|
|
|
|
|
|
mcc := ByteArray new: 3.
|
|
|
|
mcc at: 1 put: ((aByteArray at: 1) bitAnd: 16rF).
|
|
|
|
mcc at: 2 put: (((aByteArray at: 1) bitAnd: 16rF0) bitShift: -4).
|
|
|
|
mcc at: 3 put: ((aByteArray at: 2) bitAnd: 16rF).
|
|
|
|
mcc := BCD decode: mcc.
|
|
|
|
|
|
|
|
mnc := ByteArray new: 3.
|
|
|
|
mnc at: 1 put: ((aByteArray at: 3) bitAnd: 16rF).
|
|
|
|
mnc at: 2 put: (((aByteArray at: 3) bitAnd: 16rF0) bitShift: -4).
|
|
|
|
mnc at: 3 put: (((aByteArray at: 2) bitAnd: 16rF0) bitShift: -4).
|
|
|
|
|
|
|
|
"Need to check if we have two or three bytes here."
|
|
|
|
(mnc at: 3) = 16rF
|
|
|
|
ifTrue: [
|
|
|
|
mnc := BCD decode: (mnc copyFrom: 1 to: 2).
|
|
|
|
]
|
|
|
|
ifFalse: [
|
|
|
|
mnc := BCD decode: mnc.
|
|
|
|
].
|
|
|
|
|
|
|
|
^ LAI initWith: mcc mnc: mnc.
|
|
|
|
]
|
|
|
|
|
2010-11-17 09:21:48 +00:00
|
|
|
LAI class >> generateLAI: mcc mnc: mnc [
|
2010-11-19 08:02:26 +00:00
|
|
|
<category: 'creation'>
|
2010-11-23 17:47:39 +00:00
|
|
|
| lai |
|
|
|
|
|
|
|
|
lai := LAI initWith: mcc mnc: mnc.
|
|
|
|
^ lai toMessage asByteArray.
|
|
|
|
]
|
|
|
|
|
|
|
|
writeOn: aMsg [
|
2010-11-17 09:21:48 +00:00
|
|
|
| mcc_bcd mnc_bcd lai_0 lai_1 lai_2 |
|
|
|
|
mcc_bcd := BCD encode: mcc.
|
|
|
|
mnc_bcd := BCD encode: mnc.
|
|
|
|
|
|
|
|
lai_0 := (mcc_bcd at: 1) bitOr: ((mcc_bcd at: 2) bitShift: 4).
|
|
|
|
lai_1 := mcc_bcd at: 3.
|
|
|
|
|
|
|
|
mnc > 99
|
|
|
|
ifTrue: [
|
|
|
|
lai_1 := lai_1 bitOr: ((mnc_bcd at: 3) bitShift: 4).
|
|
|
|
lai_2 := (mnc_bcd at: 1) bitOr: ((mnc_bcd at: 2) bitShift: 4)
|
|
|
|
]
|
|
|
|
ifFalse: [
|
|
|
|
lai_1 := lai_1 bitOr: (16rF bitShift: 4).
|
|
|
|
lai_2 := (mnc_bcd at: 2) bitOr: ((mnc_bcd at: 3) bitShift: 4)
|
|
|
|
].
|
|
|
|
|
2010-11-23 17:47:39 +00:00
|
|
|
aMsg putByte: lai_0.
|
|
|
|
aMsg putByte: lai_1.
|
|
|
|
aMsg putByte: lai_2.
|
|
|
|
]
|
|
|
|
|
|
|
|
mcc [
|
|
|
|
^ mcc
|
|
|
|
]
|
|
|
|
|
|
|
|
mcc: aMcc [
|
|
|
|
mcc := aMcc.
|
|
|
|
]
|
|
|
|
|
|
|
|
mnc [
|
|
|
|
^ mnc
|
2010-11-17 09:21:48 +00:00
|
|
|
]
|
2010-11-23 17:47:39 +00:00
|
|
|
|
|
|
|
mnc: aMnc [
|
|
|
|
mnc := aMnc.
|
|
|
|
]
|
|
|
|
|
2010-11-17 09:21:48 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
GSM0808IE subclass: GSMCellIdentifier [
|
2010-11-19 08:02:26 +00:00
|
|
|
<category: 'osmo-message'>
|
|
|
|
<comment: 'Generate a GSM0808 Cell Identifier'>
|
|
|
|
|
2010-11-23 17:47:39 +00:00
|
|
|
| lai lac ci |
|
2010-11-19 08:02:26 +00:00
|
|
|
GSMCellIdentifier class >> elementId [ <category: 'spec'> ^ 5 ]
|
2010-11-17 09:21:48 +00:00
|
|
|
GSMCellIdentifier class >> initWith: mcc mnc: mnc lac: lac ci: ci [
|
2010-11-19 08:02:26 +00:00
|
|
|
<category: 'creation'>
|
2010-11-17 09:21:48 +00:00
|
|
|
^ (self new)
|
|
|
|
mcc: mcc mnc: mnc lac: lac ci: ci;
|
|
|
|
yourself
|
|
|
|
]
|
|
|
|
|
2010-11-23 19:08:49 +00:00
|
|
|
GSMCellIdentifier class >> parseFrom: aByteArray [
|
|
|
|
| lai lac ci |
|
|
|
|
(aByteArray at: 3) = 0
|
|
|
|
ifFalse: [
|
|
|
|
Error signal: 'Can not handle Cell Identifier of type != 0'.
|
|
|
|
].
|
|
|
|
|
|
|
|
lai := LAI parseFrom: (aByteArray copyFrom: 4).
|
|
|
|
lac := (aByteArray ushortAt: 7) swap16.
|
|
|
|
ci := (aByteArray ushortAt: 9) swap16.
|
|
|
|
|
|
|
|
^ self new
|
|
|
|
mcc: lai mcc mnc: lai mnc lac: lac ci: ci;
|
|
|
|
yourself
|
|
|
|
]
|
|
|
|
|
2010-11-17 09:21:48 +00:00
|
|
|
mcc: aMcc mnc: aMnc lac: aLac ci: aCi [
|
2010-11-19 08:02:26 +00:00
|
|
|
<category: 'creation'>
|
2010-11-23 17:47:39 +00:00
|
|
|
lai := LAI initWith: aMcc mnc: aMnc.
|
2010-11-17 09:21:48 +00:00
|
|
|
lac := aLac.
|
|
|
|
ci := aCi.
|
|
|
|
]
|
|
|
|
|
2010-11-23 17:47:39 +00:00
|
|
|
mcc [
|
|
|
|
<category: 'access'>
|
|
|
|
^ lai mcc
|
|
|
|
]
|
|
|
|
|
|
|
|
mnc [
|
|
|
|
<category: 'access'>
|
|
|
|
^ lai mnc
|
|
|
|
]
|
|
|
|
|
|
|
|
lac [
|
|
|
|
<category: 'access'>
|
|
|
|
^ lac
|
|
|
|
]
|
|
|
|
|
|
|
|
ci [
|
|
|
|
<category: 'access'>
|
|
|
|
^ ci
|
|
|
|
]
|
|
|
|
|
2010-11-20 00:20:00 +00:00
|
|
|
writeOn: aMsg [
|
2010-11-19 08:02:26 +00:00
|
|
|
<category: 'creation'>
|
2010-11-23 17:47:39 +00:00
|
|
|
| lai_data |
|
|
|
|
lai_data := lai toMessageOrByteArray.
|
2010-11-17 09:21:48 +00:00
|
|
|
|
|
|
|
aMsg putByte: self class elementId.
|
2010-11-23 17:47:39 +00:00
|
|
|
aMsg putByte: 1 + lai_data size + 2 + 2.
|
2010-11-17 09:21:48 +00:00
|
|
|
aMsg putByte: 0.
|
2010-11-23 17:47:39 +00:00
|
|
|
aMsg putByteArray: lai_data.
|
2010-11-17 09:21:48 +00:00
|
|
|
aMsg putLen16: lac.
|
|
|
|
aMsg putLen16: ci.
|
|
|
|
]
|
|
|
|
]
|
|
|
|
|
|
|
|
GSM0808IE subclass: GSMLayer3Info [
|
2010-11-19 08:02:26 +00:00
|
|
|
<category: 'osmo-message'>
|
|
|
|
<comment: 'Generate a Layer3 IE'>
|
2010-11-17 09:21:48 +00:00
|
|
|
| data |
|
2010-11-19 08:02:26 +00:00
|
|
|
GSMLayer3Info class >> elementId [ <category: 'spec'> ^ 23 ]
|
2010-11-17 09:21:48 +00:00
|
|
|
GSMLayer3Info class >> initWith: data [
|
2010-11-19 08:02:26 +00:00
|
|
|
<category: 'creation'>
|
2010-11-17 09:21:48 +00:00
|
|
|
^ (self new)
|
|
|
|
data: data;
|
|
|
|
yourself
|
|
|
|
]
|
|
|
|
|
|
|
|
data: aData [
|
2010-11-19 08:02:26 +00:00
|
|
|
<category: 'creation'>
|
2010-11-17 09:21:48 +00:00
|
|
|
data := aData
|
|
|
|
]
|
|
|
|
|
2010-11-20 00:20:00 +00:00
|
|
|
writeOn: aMsg [
|
2010-11-20 00:22:53 +00:00
|
|
|
| dat |
|
2010-11-19 08:02:26 +00:00
|
|
|
<category: 'creation'>
|
2010-11-17 09:21:48 +00:00
|
|
|
aMsg putByte: self class elementId.
|
2010-11-20 00:22:53 +00:00
|
|
|
|
|
|
|
dat := data toMessageOrByteArray.
|
|
|
|
aMsg putByte: dat size.
|
|
|
|
aMsg putByteArray: dat.
|
2010-11-17 09:21:48 +00:00
|
|
|
]
|
|
|
|
]
|